import queue

from fastapi import HTTPException, status


task_queue = queue.Queue()


class Task:
    """Класс задачи."""

    def __init__(self):
        self.status = "PENDING"
        self.progress = 0
        self.msg = []
        self.error = None


class TaskManager:
    """Класс для управления задачами."""

    def __init__(self):
        self.__task_results = {}

    def add_task(self, task_name: str, task_type: str):
        """Добавляет задачу в менеджер задач."""
        self.__task_results[task_type] = {
            task_name: Task(),
        }

    def __parse_data(self, data):
        """Вытаскиваем данные из словаря и помещаем в объект Task"""
        task_type = data["task_type"]
        if data.get("status"):
            self.__task_results[task_type][data["task_name"]].status = data["status"]
        if data.get("progress"):
            self.__task_results[task_type][data["task_name"]].progress = data[
                "progress"
            ]
        if data.get("msg"):
            self.__task_results[task_type][data["task_name"]].msg.append(data["msg"])
        if data.get("error"):
            self.__task_results[task_type][data["task_name"]].error = data["error"]

    def get_data_from_queue(self):
        """Парсим данные из очереди и помещаем их в объект Task."""
        while not task_queue.empty():
            self.__parse_data(task_queue.get())

    def task_results(self, task_type: str):
        """Возвращает словарь с результатами задач."""
        try:
            tasks = self.__task_results[task_type]
            if not tasks:
                raise KeyError(f"No tasks found for task type '{task_type}'")
            task_result = {
                "status": vars(list(tasks.values())[0])["status"],
                "progress": vars(list(tasks.values())[0])["progress"],
                "msg": vars(list(tasks.values())[0])["msg"],
                "error": vars(list(tasks.values())[0])["error"],
            }
            return task_result
        except KeyError as e:
            raise HTTPException(
                status_code=status.HTTP_404_NOT_FOUND,
                detail="Тип задачи не найден",
            )


task_manager = TaskManager()
